package top.wineye.spring.dependency.inject;

import jakarta.annotation.Resource;
import jakarta.inject.Inject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import top.wineye.spring.dependency.pojo.Biz;
import top.wineye.spring.dependency.pojo.BizHolder;


public class InjectByMethod {

    Biz biz1;
    Biz biz2;
    Biz biz3;

    // 通过 @Bean 可以实现方法参数注入
    @Bean
    public BizHolder holder(Biz biz) {
        return new BizHolder(biz);
    }


    @Resource
    // 在 jdk21 中 @Resource 已经被分离出去 且在 spring 6 中，使用 jakarta 作为 javaee 实现
    // @Resource 存在于  jakarta.annotation 中
    public void init1(Biz biz) {
        this.biz1 = biz;
    }

    // 通过 @Autowired
    @Autowired // (by type)
    public void init2(Biz biz2) {
        this.biz2 = biz2;
    }

    // 通过 JSR 330 @Inject
    @Inject // 可以注入成功
    public void init3(Biz biz) {
        this.biz3 = biz;
    }


    //

    public static void main(String[] args) {
        AnnotationConfigApplicationContext context =
                new AnnotationConfigApplicationContext(InjectByMethod.class);

        InjectByMethod bean = context.getBean(InjectByMethod.class);
        System.out.println(bean.biz1);
        System.out.println(bean.biz2);
        System.out.println(bean.biz3);

        context.close();
    }

    @Bean
    public Biz biz() {
        Biz biz = new Biz();
        biz.setBiz("a");
        return biz;
    }
}
